从零实现深度学习框架系列:RNN实战篇(附完整代码)

您所在的位置:网站首页 rnn pytorch代码 从零实现深度学习框架系列:RNN实战篇(附完整代码)

从零实现深度学习框架系列:RNN实战篇(附完整代码)

2023-04-09 19:04| 来源: 网络整理| 查看: 265

来源:投稿 作者:175编辑:学姐

铛铛!上期我们学习了RNN的理论部分,实战部分这就来了!

本文我们来看如何实现它,包括堆叠RNN和双向RNN。从而理解它们的原理。最后看一个应用到词性标注任务的实战。

为了方便同学们学习,学姐也整理了部分AI必读论文资料放在这里

关注【学姐带你玩AI】公众号,回复“500”免费领的哈~

RNNCell

首先实现单时间步RNN计算类,这是一个公共类:

激活函数支持tanh和relu,这只是单时间步的RNN计算,RNN模型就是基于它来实现的。

RNN

下面来实现简单RNN。

从参数可以看到,我们支持多层RNN,同时在多层RNN之间经过了一层Dropout。

为了简化实现,将batch维度放到维度1。

由于包含多层,每层含有不同的隐藏状态,所以需要按层数来拆分h。

多层的情况下,需要在合适的位置增加Dropout。比如上图的例子中,在RNN1和RNN2以及RNN2和RNN3的连接处增加Dropout。

双向RNN

双向RNN其实就是多了另一个反方向处理的RNN,因此我们首先增加新的用于处理反序输入的RNN:

最简单的方法,就是将输入逆序,然后依照正向过程重新,重新跑一遍反向RNN过程。但这样会有重复代码,因此我们把RNN沿着某个方向的运算过程抽成一个函数。

我们这里输出的维度和PyTorch保持一致。那么其中的one_directional_op是怎么实现的呢?

这里要注意的是output = F.flip(output, 0)将输出按时间步维度逆序,使得时间步t=0上,是看了整个序列的结果。

最后我们通过词性标注任务实战来应用我们的RNN。

词性标注实战

词性标注任务可以看成是多类别文本分类问题,我们使用NLTK提供的宾州树库(Penn Treebank)样例数据,首先加载词性标注语料库:

我们采用前3000句作为训练数据,其余的作为测试数据。然后实现我们的数据集类:

为了对齐批次内数据的长度,需要对输入序列和输出序列进行补齐,同时用mask记录了哪些是经过补齐的标记。

然后基于我们上面实现的RNN来实现该词性标注分类模型,这里同样也叫RNN:

这里在序列标注任务中,需要使用序列全部状态的隐藏层,存储在变量output中。

最后,在训练和预测阶段,需要使用mask来保证仅对有效标记求损失、对正确预测结果以及总的标记计数。

训练代码如下:

我们通过model.train()来model.eval()来控制需不需要进行Dropout。最终,在双向RNN中训练了10个批次,结果为:

由于电脑上没有GPU,因此速度较慢,就只训练了10个批次,看起来效果还不错,测试集上的准确率达到了70%。

完整代码:

https://github.com/nlp-greyfoss/metagrad

参考

Speech and Language Processing

自然语言处理:基于预训练模型的方法

https://nn.labml.ai/lstm/index.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3